package com.zzyl.common.utils.pdf;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.File;
import java.io.InputStream;

public class PdfParser {

    /**
     * 将指定的PDF文件解析为字符串
     *
     * @param filePath PDF文件的完整路径
     * @return 包含PDF所有文本内容的字符串
     * @throws IOException 如果文件未找到、无法读取或解析失败
     */
    public static String parsePdfToString(String filePath) throws IOException {
        // 1. 使用try-with-resources确保PDDocument对象最终被关闭
        //    这是最关键的一步，避免文件句柄泄漏。
        try (PDDocument document = PDDocument.load(new File(filePath))) {

            // 2. 检查文件是否加密（如果需要处理加密文件，需要更复杂的逻辑）
            if (document.isEncrypted()) {
                // 目前直接抛出异常。对于加密文件，你需要提供密码才能继续。
                // throw new IOException("Encrypted documents are not supported in this method.");
                // 或者尝试使用空密码解密（很多情况下无效）
                // document.decrypt("");
                // 更安全的做法是让调用者提供密码，这里我们先简单处理。
                return "该PDF文件已加密，无法直接解析文本。";
            }

            // 3. 创建PDFTextStripper对象，用于提取文本
            PDFTextStripper pdfStripper = new PDFTextStripper();

            // 4. （可选）设置文本提取的起始和结束页码
            // pdfStripper.setStartPage(1);
            // pdfStripper.setEndPage(5);

            // 5. 从文档中获取全部文本
            String text = pdfStripper.getText(document);
            return text;

        } // 6. try-with-resources块结束，PDDocument会自动调用close()方法
    }

    /**
     * 重载方法，接受File对象作为参数
     *
     * @param pdfFile PDF文件对象
     * @return 包含PDF所有文本内容的字符串
     * @throws IOException 如果文件未找到、无法读取或解析失败
     */
    public static String parsePdfToString(File pdfFile) throws IOException {
        try (PDDocument document = PDDocument.load(pdfFile)) {
            if (document.isEncrypted()) {
                return "该PDF文件已加密，无法直接解析文本。";
            }
            PDFTextStripper pdfStripper = new PDFTextStripper();
            return pdfStripper.getText(document);
        }
    }

    /**
            * 重载方法，接受Spring MultipartFile对象作为参数
     * 适用于Web文件上传场景
     *
             * @param multipartFile Spring MultipartFile对象
     * @return 包含PDF所有文本内容的字符串
     * @throws IOException 如果文件读取或解析失败
     * @throws IllegalArgumentException 如果文件不是PDF格式
     */
    public static String parsePdfToString(MultipartFile multipartFile) throws IOException {
        // 1. 验证文件类型
        String contentType = multipartFile.getContentType();
        String originalFilename = multipartFile.getOriginalFilename();

        if (contentType == null || !contentType.equals("application/pdf")) {
            if (originalFilename != null && !originalFilename.toLowerCase().endsWith(".pdf")) {
                throw new IllegalArgumentException("上传的文件不是PDF格式。当前文件类型: " + contentType);
            }
        }

        // 2. 使用try-with-resources确保InputStream被正确关闭
        //    这里使用PDDocument.load(InputStream)来避免创建临时文件
        try (InputStream inputStream = multipartFile.getInputStream();
             PDDocument document = PDDocument.load(inputStream)) {

            // 3. 检查加密
            if (document.isEncrypted()) {
                return "该PDF文件已加密，无法直接解析文本。";
            }

            // 4. 提取文本
            PDFTextStripper pdfStripper = new PDFTextStripper();
            return pdfStripper.getText(document);
        }
    }
    public static void main(String[] args) {
        // 指定你的PDF文件路径
        String filePath = "E:\\ziliao\\中州养老（ruoyi+AI）\\day08\\资料\\体检报告样例\\体检报告-刘爱国-男-69岁.pdf";

        try {
            // 调用解析方法
            String pdfText = PdfParser.parsePdfToString(filePath);

            // 打印或处理提取出的文本
            System.out.println("提取的文本内容：");
            System.out.println(pdfText);

            // 你可以将文本保存到文件、写入数据库或进行NLP分析等
            // Files.write(Paths.get("output.txt"), pdfText.getBytes());

        } catch (IOException e) {
            // 妥善处理异常：文件不存在、无读取权限、损坏的PDF等
            System.err.println("解析PDF时发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
}